﻿#define _CRT_SECURE_NO_WARNINGS 1

//一、Linux权限的概念 

//Linux下有两种用户：超级用户（root）、普通用户。

//• 超级用户：可以再linux系统下做任何事情，不受限制 （不受到权限的约束）
//• 普通用户：在linux下做有限的事情（受权限的约束）
//• 超级用户的命令提示符是“#”，普通用户的命令提示符是“$”

//命令：su [用户名] 

//功能：切换用户

//例如，要从root用户切换到普通用户user，则使用 su user,或者从刚切换成的root退出就用exit或者ctrl+d， 
//要从普通用户user切换到root用户则使用 sudo su / su - / su root（root可以省略），此时系统会提示输入root用户的
//口令，而如果我是root用户，我要直接切换成我下面的某个普通用户，可以使用 su 普通用户名字.

//注意：
//（1）如果想要将某一命令进行切换成root进行执行，可以这样：sudo 命令
//（2）系统目前不支持我们新建的用户执行sudo，因为系统不信任你，除非未来将普通用户添加到我们信任的白名单中


//二、Linux权限管理 

//1. 文件访问者的分类（人）
//• 文件和文件目录的所有者：u--User（中国平民法律问题） 
//• 文件和文件目录的所有者所在的组的用户：g--Group（不多说） 
//• 其它用户：o--Others （外国⼈） 

//2. 文件类型和访问权限（事物属性）
//• 文件类型：
// d：目录文件（文件夹）（重要）：文本，可执行程序，库基本都属于普通文件
// - ：普通文件 （重要）
// l：软链接（类似Windows的快捷方式） 
// b：块设备文件（例如硬盘、光驱等） 
// p：管道文件
// c：字符设备文件（例如屏幕等串口设备） 
// s：套接口文件 

//注意：linux中，文件的类型是ll指令所看见的一行的第一个，而Linux中文件后缀往往是没有直接意义的

//• 基本权限：
//读（r/4）：Read对文件而言，具有读取文件内容的权限；对目录来说，具有浏览该目录信息的权限
//写（w/2）：Write对文件而言，具有修改文件内容的权限；对目录来说具有删除移动目录内文件的权限
//执行（x/1）：execute对文件而言，具有执行文件的权限；对目录来说，具有进入目录的权限
//“—”表示不具有该项权限
 
//注意：
//（1）在linux中，文件名的后缀和文件的类型往往没有直接意义，但是不代表没用，例如：linux中的gcc就需要识别文件后缀
//因为gcc是一款编译器，是软件。
//（2）在linux中，文件后缀看用户自己的需求
//(3)Linux在进行权限认证的时候，其只能认证一种 

//3.文件权限值的表示方法
//（1）字符表示方法
//（2）8进制数值表示方法,用三位二进制分别代表每一种用户的权限


//三、文件访问权限的相关设置方法

//在linux中，文件拥有权限的角色划分分为三类：拥有者、group（所属组）、other
//所属组的存在：一个文件不想让other看见，而需要所属组的人员看见

//1. chmod 

//功能：设置文件的访问权限

//格式：chmod [参数] 权限 文件名

//常用选项：
//• -R ：递归修改目录文件的权限
//说明：只有文件的拥有者和root才可以改变文件的权限

//chmod命令权限值的格式： 

//• 用户表示符 + / - = 权限字符 
//+ :向权限范围增加权限代号所表示的权限 
//- :向权限范围取消权限代号所表示的权限
//= : 向权限范围赋予权限代号所表示的权限 
// 用户符号： 
// u：拥有者 （user）
// g：拥有者同组用(group)
// o：其它用户 (other)
// a：所有用户(all)

//例如：
//（1）对拥有者（user）删除和增加权限操作
//对test1023的拥有者（user）增加读的权限：chmod u+r test1023
//对test1023的拥有者（user）去除可执行的权限：chmod u-x test1023
//对test1023的拥有者（user）去掉读和写的权限：chmod u-rw test1023
//（2）对所属组（group）的删除和增加权限操作
//对test1023的所属组（group）增加读的权限：chmod g+r test1023
//对test1023的所属组（group）去掉读和写的权限：chmod g-rw test1023
//(3)对other的删除和增加权限操作
//对test1023的other增加读的权限：chmod o+r test1023
//对test1023的other去掉读和写的权限：chmod o-rw test1023
//（4）chmod u + w / home / abc.txt
//（5）chmod o - x / home / abc.txt
//（6）chmod a = x / home / abc.txt

//• 三位8进制数字

//例如：
//实例：
//（1）chmod 664 test1023,也就是对应的三位二进制：110 110 100
//拥有者可读可写不可执行，所属组可读可写不可执行，other可读不可写不可执行
//（2）chmod 640 test1023,也就是对应的三位二进制：110 100 000
//拥有者可读可写不可执行，所属组可读不可写不可执行，other不可读不可写不可执行


//2. chown 

//功能：修改文件的拥有者

//格式：chown [参数] 用户名 文件名 

//实例：
//（1）把file1文件给jay用户：chown jay file1
//（2）把file1文件强制给jay用户：sudo chown jay file1（转换程root用户）
//（3）把filegroup下的所有文件按照递归全部给jay：chown - R jay filegroup1
//（4）把文件file3的拥有者和所属组全部改成jay：chown jay:jay file3

//3. chgrp 

//功能：修改文件或目录的所属组

//格式：chgrp [参数] 用户组名 文件名 

//常用选项： - R 递归修改文件或目录的所属组 

//实例： 
// 改变file2的所属组给jay：chgrp jay file2


//4.权限掩码（umask）：

//我们创建的目录文件其默认权限是;775
//我们创建的普通文件其默认权限是;664

//其实，在linux下，我们默认给的普通文件起始权限其实是：666，而目录文件是777，但是由于权限掩码的存在，
//凡是在umask中出现过的权限，就不会在最终的文件权限中出现

//功能：
//• 查看或修改文件掩码
//• 新建文件夹默认权限 = 0666 
//• 新建目录默认权限 = 0777 
//• 但实际上你所创建的文件和目录，看到的权限往往不是上面这个值。原因就是创建文件或目录的
//时候还要受到umask的影响。假设默认权限是mask，则实际创建的出来的文件权限是：最终权限=起始权限&（~umask）

//格式：umask 权限值 

//说明：将现有的存取权限减去权限掩码后，即可产生建立文件时预设权限。超级用户默认掩码值为
//0022，普通用户默认为0002 

//实例： 
//（1）查看权限掩码：umask 
//（2）设置权限掩码为004：umask 044
//（3）设置权限掩码使得我们创建出来的文件不具有可读和可执行的功能：umask 0555


//四、目录文件的权限

//可执行权限:如果目录没有可执行权限, 则无法进入到目录中 
//可读权限:如果目录没有可读权限,则无法用ls等命令查看目录中的文件内容 ，也无法删除目录文件中的文件
//可写权限:如果目录没有可写权限,则无法在目录中创建文件,也无法在目录中删除文件
//注意：
//（1）文件是否可以进入只与可执行权限有关，与读和写无关
//（2）一个文件能否被删除，并不取决于文件的本身，而是由这个文件所在的目录决定

//五、粘滞位（一般是给共享目录设置）

//问题：在一个共享文件下，我们两个人都创建了自己的文件，但是我们创建的文件可以被别人删除，如何解决这个问题呢
//那么就产生了粘滞位的概念

//功能：加上粘滞位后，在一个公共目录下，我们就不可以删除别人所创建的文件了

//当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由 
//1. 超级管理员删除
//2. 该文件的所有者删除

//六、关于权限的总结 
//（1）目录的可执行权限是表示你可否在目录下执行命令
//（2）如果目录没有  - x 权限，则无法对目录执行任何命令,甚至无法 cd 进入目录,即目录仍然有 - r 读
//权限（这个地方很容易犯错，认为有读权限就可以进入目录读取目录下的文件）
//（3）而如果目录具有 - x 权限，但没有  - r 权限，则用户可以执行命令，可以 cd 进入目录。但由于没有
//目录的读权限
//（4）所以在目录下，即使可以执行 ls 命令，但仍然没有权限读出目录下的文档